home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nebula 2
/
Nebula Two.iso
/
SourceCode
/
Classes
/
AppExceptions
/
AppExceptions.m
< prev
next >
Wrap
Text File
|
1995-06-12
|
2KB
|
81 lines
/* AppExceptions
*
* A category of Application that provides methods for mapping
* ASCII names to integers for use in NeXTSTEP exception handling.
*
* Copyright 1991, 1992 Scott Hess. This source code may be
* redistributed and modified without restriction. Well, one
* restriction - do not claim that you wrote it.
*
* Scott Hess
* 12901 Upton Avenue South, #326
* Burnsville, MN 55337
* (612) 895-1208
* scott@gac.edu
* shess@ssesco.com
*/
#import "AppExceptions.h"
#import <appkit/errors.h>
#import <objc/HashTable.h>
@implementation Application (AppExceptions)
int appExceptionsReference=0;
/* Hash exception names to numbers. */
static HashTable *exceptionTable=nil;
/* Base for building exceptions. */
static int exceptionBase=NX_APPBASE;
/* Reports errors for our exceptions. */
static void errorReporter( NXHandler *h)
{
const char *name=[NXApp nameForException:h->code];
if( name) {
fprintf( stderr, "Uncaught exception %s==%d.\n", name, h->code);
} else {
fprintf( stderr, "Unknown exception %d.\n", h->code);
}
}
-(int)exceptionFor:(const char *)name
{
if( !name) {
int exception;
if( !exceptionTable) {
exceptionTable=[[HashTable alloc] initKeyDesc:"*" valueDesc:"i" capacity:32];
NXRegisterErrorReporter( NX_APPBASE, NX_APPBASE+999, errorReporter);
}
exception=(int)[exceptionTable valueForKey:name];
if( !exception) {
exception=exceptionBase++;
[exceptionTable insertKey:name value:(void *)exception];
}
return exception;
}
return -1;
}
-(const char *)nameForException:(int)exception
{
const char *key;
int value;
NXHashState state=[exceptionTable initState];
while( [exceptionTable nextState:&state key:(const void **)&key
value:(void **)&value]) {
if( exception==value) {
return key;
}
}
return NULL;
}
- raiseException:(const char *)name with:(const void *)data1 with:(const void *)data2
{
NX_RAISE( [self exceptionFor:name], data1, data2);
}
- raiseException:(const char *)name with:(const void *)data1
{
return [self raiseException:name with:data1 with:NULL];
}
- raiseException:(const char *)name
{
return [self raiseException:name with:NULL with:NULL];
}
@end